﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Protocolo.Enums;
using Protocolo.Mensajes.Response;
using Protocolo.AnchoDeBanda;

namespace Protocolo.Mensajes.Request
{
    public class DescargarArchivoRequest : MensajeBase
    {
        protected override string Datos
        {
            get
            {
                return NombreArchivo.PadLeft(50) + ByteDesde.ToString();
            }
            set
            {
                NombreArchivo = value.Substring(0, 50).Trim();
                ByteDesde = long.Parse(value.Substring(50).Trim());
            }
        }

        public string NombreArchivo { get; set; }
        public long ByteDesde { get; set; }

        public DescargarArchivoRequest()
        {
            this.Header = TipoMensajeEnum.REQ;
            this.Cmd = ComandoEnum.DescargarArchivo;
        }

        public DescargarArchivoResponse DescargarArchivo(string ip, int puerto, string repositorio, AnchoDeBandaServidor anchoDeBandaServidor)
        {
            var comunicacionTCP = new ComunicacionTCP();
            try
            {
                //Abro la conexion
                comunicacionTCP.ConectarCliente(ip, puerto);

                DescargarArchivoResponse response;

                //Envio mensaje pidiendo descargar archivo
                comunicacionTCP.EnviarMensaje(this);

                //Recibo respuesta
                response = (DescargarArchivoResponse)comunicacionTCP.RecibirMensaje();

                if (response.Resultado != ResultadoTransferenciaArchivoEnum.OK)
                    return response;

                //Envio request nuevamente para comenzar a bajar archivo (este mensaje es para sincronizar con el servidor solamente)
                comunicacionTCP.EnviarMensaje(this);

                //Envio el archivo
                string checksum = comunicacionTCP.RecibirArchivo(string.Format("{0}\\{1}", repositorio, this.NombreArchivo), ByteDesde == 0, response.LargoArchivo - this.ByteDesde, anchoDeBandaServidor);

                response.Resultado = (checksum == response.MD5) ? ResultadoTransferenciaArchivoEnum.OK : ResultadoTransferenciaArchivoEnum.ErrorChecksum;

                return response;
            }
            catch (Exception ex)
            {
                throw new Exception("Error enviando mensaje " + ex.Message);
            }
            finally
            {
                comunicacionTCP.CerrarConexion();
            }
        }
    }
}
